1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.util.concurrent.testing;
18
19 import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService;
20
21 import com.google.common.base.Preconditions;
22 import com.google.common.util.concurrent.ForwardingListenableFuture.SimpleForwardingListenableFuture;
23 import com.google.common.util.concurrent.ListenableFuture;
24 import com.google.common.util.concurrent.ListenableScheduledFuture;
25 import com.google.common.util.concurrent.ListeningExecutorService;
26 import com.google.common.util.concurrent.ListeningScheduledExecutorService;
27
28 import java.util.Collection;
29 import java.util.List;
30 import java.util.concurrent.AbstractExecutorService;
31 import java.util.concurrent.Callable;
32 import java.util.concurrent.Delayed;
33 import java.util.concurrent.ExecutionException;
34 import java.util.concurrent.Future;
35 import java.util.concurrent.TimeUnit;
36 import java.util.concurrent.TimeoutException;
37
38
39
40
41
42
43
44
45
46
47
48 class SameThreadScheduledExecutorService extends AbstractExecutorService
49 implements ListeningScheduledExecutorService {
50
51 private final ListeningExecutorService delegate = newDirectExecutorService();
52
53 @Override
54 public void shutdown() {
55 delegate.shutdown();
56 }
57
58 @Override
59 public List<Runnable> shutdownNow() {
60 return delegate.shutdownNow();
61 }
62
63 @Override
64 public boolean isShutdown() {
65 return delegate.isShutdown();
66 }
67
68 @Override
69 public boolean isTerminated() {
70 return delegate.isTerminated();
71 }
72
73 @Override
74 public boolean awaitTermination(long timeout, TimeUnit unit)
75 throws InterruptedException {
76 Preconditions.checkNotNull(unit, "unit must not be null!");
77 return delegate.awaitTermination(timeout, unit);
78 }
79
80 @Override
81 public <T> ListenableFuture<T> submit(Callable<T> task) {
82 Preconditions.checkNotNull(task, "task must not be null!");
83 return delegate.submit(task);
84 }
85
86 @Override
87 public <T> ListenableFuture<T> submit(Runnable task, T result) {
88 Preconditions.checkNotNull(task, "task must not be null!");
89 Preconditions.checkNotNull(result, "result must not be null!");
90 return delegate.submit(task, result);
91 }
92
93 @Override
94 public ListenableFuture<?> submit(Runnable task) {
95 Preconditions.checkNotNull(task, "task must not be null!");
96 return delegate.submit(task);
97 }
98
99 @Override
100 public <T> List<Future<T>> invokeAll(
101 Collection<? extends Callable<T>> tasks) throws InterruptedException {
102 Preconditions.checkNotNull(tasks, "tasks must not be null!");
103 return delegate.invokeAll(tasks);
104 }
105
106 @Override
107 public <T> List<Future<T>> invokeAll(
108 Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
109 throws InterruptedException {
110 Preconditions.checkNotNull(tasks, "tasks must not be null!");
111 Preconditions.checkNotNull(unit, "unit must not be null!");
112 return delegate.invokeAll(tasks, timeout, unit);
113 }
114
115 @Override
116 public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
117 throws InterruptedException, ExecutionException {
118 Preconditions.checkNotNull(tasks, "tasks must not be null!");
119 return delegate.invokeAny(tasks);
120 }
121
122 @Override
123 public <T> T invokeAny(Collection<? extends Callable<T>> tasks,
124 long timeout, TimeUnit unit)
125 throws InterruptedException, ExecutionException, TimeoutException {
126 Preconditions.checkNotNull(tasks, "tasks must not be null!");
127 Preconditions.checkNotNull(unit, "unit must not be null!");
128 return delegate.invokeAny(tasks, timeout, unit);
129 }
130
131 @Override
132 public void execute(Runnable command) {
133 Preconditions.checkNotNull(command, "command must not be null!");
134 delegate.execute(command);
135 }
136
137 @Override
138 public ListenableScheduledFuture<?> schedule(Runnable command, long delay,
139 TimeUnit unit) {
140 Preconditions.checkNotNull(command, "command must not be null");
141 Preconditions.checkNotNull(unit, "unit must not be null!");
142 return schedule(java.util.concurrent.Executors.callable(command),
143 delay, unit);
144 }
145
146 private static class ImmediateScheduledFuture<V>
147 extends SimpleForwardingListenableFuture<V>
148 implements ListenableScheduledFuture<V> {
149 private ExecutionException exception;
150
151 protected ImmediateScheduledFuture(ListenableFuture<V> future) {
152 super(future);
153 }
154
155 @Override
156 public V get(long timeout, TimeUnit unit)
157 throws InterruptedException, ExecutionException, TimeoutException {
158 Preconditions.checkNotNull(unit, "unit must not be null!");
159 return get();
160 }
161
162 @Override
163 public long getDelay(TimeUnit unit) {
164 Preconditions.checkNotNull(unit, "unit must not be null!");
165 return 0;
166 }
167
168 @Override
169 public int compareTo(Delayed other) {
170 Preconditions.checkNotNull(other, "other must not be null!");
171 return 0;
172 }
173 }
174
175 @Override
176 public <V> ListenableScheduledFuture<V> schedule(final Callable<V> callable,
177 long delay, TimeUnit unit) {
178 Preconditions.checkNotNull(callable, "callable must not be null!");
179 Preconditions.checkNotNull(unit, "unit must not be null!");
180 ListenableFuture<V> delegateFuture = submit(callable);
181 return new ImmediateScheduledFuture<V>(delegateFuture);
182 }
183
184 @Override
185 public ListenableScheduledFuture<?> scheduleAtFixedRate(Runnable command,
186 long initialDelay, long period, TimeUnit unit) {
187 throw new UnsupportedOperationException(
188 "scheduleAtFixedRate is not supported.");
189 }
190
191 @Override
192 public ListenableScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
193 long initialDelay, long delay, TimeUnit unit) {
194 throw new UnsupportedOperationException(
195 "scheduleWithFixedDelay is not supported.");
196 }
197 }